print("****************协同程序****************")
print("****************协程的创建****************")
-- coroutine.create()
fun = function()
    print(123)
end

co = coroutine.create(fun)
-- 协程的本质是一个线程对象
print(co)                       -- thread: 协程号
print(type(co))                 -- thread

co2 = coroutine.create(function()
            print(456)
end)
-- 协程的本质是一个线程对象
print(co2)                      -- thread: 协程号
print(type(co2))                -- thread

-- coroutine.wrap()
co3 = coroutine.wrap(fun)
print(co3)                      -- function: 协程号
print(type(co3))                -- function


print("****************协程的运行****************")
-- 第一种方式 对应的 通过 create 创建的协程
coroutine.resume(co)            -- 123
-- 第二种方式 对应的 通过 wrap 创建的协程
co3()                           -- 123

print("****************协程的挂起****************")
fun2 = function()
    local i = 1
    while true do
        print("循环" .. i)      -- 循环i
        i = i + 1
        -- 协程的挂起函数 yield可以有返回值
        -- coroutine.yield()
        print("co4 : " .. coroutine.status(co4))    -- co : running
        print(coroutine.running())                  -- thread: 协程号
        coroutine.yield(i)
    end
end

co4 = coroutine.create(fun2)
-- resume 默认第一个返回值是 协程是否启动成功
-- 然后是 yield里面的返回值
isOK, tempI =  coroutine.resume(co4)
print(isOK, tempI)          -- true 2
isOK, tempI =  coroutine.resume(co4)
print(isOK, tempI)          -- true 3
isOK, tempI =  coroutine.resume(co4)
print(isOK, tempI)          -- true 4

-- wrap方式的写成调用也有返回值 即yield里面的返回值
co5 = coroutine.wrap(fun2)
co5()
co5()
co5()

print("****************协程的状态****************")
-- coroutine.status(协程对象)
-- dead 结束
-- suspended 暂停
-- running 进行中
print("co : " .. coroutine.status(co))      -- co : dead
print("co2 : " .. coroutine.status(co2))    -- co2 : suspended
print("co4 : " .. coroutine.status(co4))    -- co4 : suspended
-- print(coroutine.status(co5))     报错

-- coroutine.running() 得到正在运行的协程号
print(coroutine.running())                  -- nil